/**
 * @file MagGraphicsView.h
 * @brief 图形视图类
 *
 * 继承自QGraphicsView类，实现了鼠标滚轮事件、鼠标按下、移动、释放事件的处理函数，以及鼠标坐标标签的显示。
*/

#pragma once

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QWheelEvent>
#include <QLabel>
#include <QMouseEvent>
#include <QTransform>
#include <QPushButton>
#include <QGraphicsRectItem>
#include <QPolygonF>
#include <QList>
#include "GMesh.h"

/**
 * @brief 图形视图类
 * 
 * 继承自QGraphicsView类，实现了鼠标滚轮事件、鼠标按下、移动、释放事件的处理函数，以及鼠标坐标标签的显示。
*/
class MagGraphicsView : public QGraphicsView
{
    Q_OBJECT
private:
    QGraphicsScene *scene; // 图形场景
    QLabel *coordinateLabel; // 鼠标坐标标签
    QPointF lastPos; // 上一次鼠标位置记录
public:
    /**
     * @brief 构造函数
     * @param parent 父对象
    */
    MagGraphicsView(QWidget *parent = nullptr);
    /**
     * @brief 析构函数
    */
    ~MagGraphicsView();
    /**
     * @brief 向场景中添加点
     * @param point 点坐标
    */
    void addPoint(QList<QPointF> Points);
    /**
     * @brief 向场景中添加线
     * @param Points 线端点坐标
    */
    void addLine(QList<QLineF> Lines);
    /**
     * @brief 向场景中添加三角形
     * @param Points 三角形三个顶点坐标
    */
    void addRriangle(QList<QPointF> Points);
    /**
     * @brief 清空场景
    */
    void clearCanvas();
public slots:
    /**
     * @brief 显示网格
     * @param mesh 网格对象
    */
    void showMesh(const GMesh& mesh);
    /**
     * @brief 将显示的图形缩放到合适大小
     * @param ShowGraphics 显示的图形对象
    */
    void resizeGraphics(MagGraphicsView* ShowGraphics);
protected:
    /**
     * @brief 重写鼠标滚轮事件处理函数
     * @param event 事件对象
    */
    void wheelEvent(QWheelEvent *event) override; 
    /**
     * @brief 重写鼠标按下事件处理函数
     * @param event 事件对象
    */
    void mousePressEvent(QMouseEvent *event) override; 
    /**
     * @brief 重写鼠标移动事件处理函数
     * @param event 事件对象
    */
    void mouseMoveEvent(QMouseEvent *event) override; 
    /**
     * @brief 重写鼠标释放事件处理函数
     * @param event 事件对象
    */
    void mouseReleaseEvent(QMouseEvent *event) override; 
    /**
     * @brief 重写事件过滤器函数
     * @param obj 事件对象
    */
    bool eventFilter(QObject *obj, QEvent *event) override; 
};
